DISCUSSION
If tasks are waiting on the semaphore, the oldest (first queued) task is unblocked so that the corresponding
MPWaitOnSemaphore
call for that task completes. Otherwise, if the value of the semaphore is not already equal to its maximum value, it is incremented by one.
Note that you can call this function from an interrupt handler.